#include "ProtocoloPlano.h"
#include "../../utils/Logger.h"
#include "../../utils/UtilString.h"
#include "../Mensajes/MensajeTexto.h"
#include "../Mensajes/MensajeAdministrarChat.h"
#include "../Mensajes/MensajeQueryChats.h"
#include "../Mensajes/MensajeQueryChatsResponse.h"
#include "../Mensajes/MensajeAgregarUsuario.h"
#include "../Mensajes/MensajeRemoverUsuario.h"
#include "../Mensajes/MensajeIdentificatorio.h"

ProtocoloPlano::ProtocoloPlano(){}

Mensaje* ProtocoloPlano::deserializar(std::string& serializacion){

	MENSAJE_Types tipoMensaje= getTipoMensaje(serializacion);

	switch (tipoMensaje) {
	case AGREGAR_USUARIO:
			return new MensajeAgregarUsuario(serializacion);
		break;
	case REMOVER_USUARIO:
			return new MensajeRemoverUsuario(serializacion);
		break;
	case MENSAJE_TEXTO:
			return new MensajeTexto(serializacion);
		break;
	case MENSAJE_IDENTIFICATORIO:
			return new MensajeIdentificatorio(serializacion);
		break;
	case MENSAJE_QUERY_CHATS:
			return new MensajeQueryChats(serializacion);
		break;
	case MENSAJE_RESPONSE_QUERY_CHATS:
			return new MensajeQueryChatsResponse(serializacion);
		break;
	case MENSAJE_ADMIN_CHATS:
			return new MensajeAdministrarChat(serializacion);
		break;
	default:
		Logger::getInstance().logMessage(Logger::ERROR,
				"BUG! - No se definio el tipo en el deserializador. Ver -> ProtocoloPlano::deserializar");
		break;
	}

	return NULL;
}

MENSAJE_Types ProtocoloPlano::getTipoMensaje(std::string& serializacion){
	std::vector<std::string> valores;
	UtilString::splitWithSeparator(&valores,serializacion,PLANO_SEPARATOR);

	return (MENSAJE_Types)UtilString::stringToInt(valores[0]);
}

std::string ProtocoloPlano::serializar(const Mensaje& mensaje){
	return mensaje.serializar();
}



